/**  
* @Title: CustomizedRedisCacheManager.java
* @Package com.lemon.conf.redis.custom
* @Description: (一句话阐述):
* @author Ran_cc
* @date 2018年5月28日
* @version V1.0  
*/
package com.lemon.conf.redis.custom;

import java.time.Duration;
import java.util.Collection;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.Cache;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.core.RedisOperations;

import com.lemon.utils.StringUtil;
import com.lemon.utils.sval.StaticValues;

/**
 * <p>
 * Title:
 * </p>
 * <p>
 * Description: redis整合springcache
 * </p>
 * <p>
 * Company:
 * </p>
 * 
 * @author Ran_cc
 * @date 2018年5月28日
 * @版本 V 1.0
 */
public class CustomizedRedisCacheManager extends RedisCacheManager {

	private static final Logger log = LoggerFactory.getLogger(CustomizedRedisCache.class);

	private RedisCacheConfiguration cf;
	private RedisCacheWriter wr;
	private RedisOperations<String, String> ro;


	public CustomizedRedisCacheManager( RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration ) {
		super(cacheWriter, defaultCacheConfiguration);
		wr = cacheWriter;
		cf = defaultCacheConfiguration;
	}

	public CustomizedRedisCacheManager( RedisCacheWriter cacheWriter,
			RedisCacheConfiguration defaultCacheConfiguration,
			RedisOperations<String, String> redisOperations ) {
		super(cacheWriter, defaultCacheConfiguration);
		wr = cacheWriter;
		cf = defaultCacheConfiguration;
		ro = redisOperations;
	}


	/**
	 * 缓存参数的分隔符
	 * 数组元素0=缓存的名称
	 * 数组元素1=缓存过期时间TTL
	 * 数组元素2=缓存在多少秒开始主动失效来强制刷新
	 */
	private String separator = StaticValues.CACHE_SEPARATOR;
	/**
	 * 缓存主动在失效前强制刷新缓存的时间
	 * 单位：秒
	 */
	private long preloadSecondTime = StaticValues.CACHE_PRELOADSECONDTIME;

	public String getSeparator() {

		return this.separator;
	}

	public void setSeparator( String separator ) {

		this.separator = separator;
	}

	public long getPreloadSecondTime() {

		return this.preloadSecondTime;
	}
	public void setPreloadSecondTime( long preloadSecondTime ) {
		this.preloadSecondTime = preloadSecondTime;
	}

	///////////////////////////////////////////////////////////////////////
	/**
	 * <p>
	 * Title: getCache
	 * </p>
	 * <p>
	 * Description:(一句话阐述): 动态设置缓存时间, 可以用在cache的注解上面 格式为 cacheName#50#10 #50 #10 单位秒
	 * </p>
	 * 
	 * @param name 带时间的key
	 * @return
	 * @author Ran_cc
	 * @date 2018年5月28日
	 */
	@Override
	public Cache getCache( String name ) {
		String [] cacheParams = name.split(this.getSeparator());
		String cacheName = cacheParams[0];

		if (StringUtil.isEmpty(cacheName)) {
			return null;
		}
		long expirationSecondTime = 0L;
		//		long tt = cf.getTtl().getSeconds();
		//		log.info("ttl:" + tt);
		//失效时间
		if (cacheParams.length > 1) {
			expirationSecondTime = Long.parseLong(cacheParams[1]);
			cf = cf.entryTtl(Duration.ofSeconds(expirationSecondTime));
		} else {
			cf = cf.entryTtl(Duration.ofSeconds(StaticValues.CACHE_EXPIRATIONSECONDTIME));
		}
		//刷新时间
		if (cacheParams.length > 2) {
			this.setPreloadSecondTime(Long.parseLong(cacheParams[2]));
		} else {
			this.setPreloadSecondTime(StaticValues.CACHE_PRELOADSECONDTIME);
		}

		Cache cache = super.getCache(cacheName);
		if (null == cache) {
			return cache;
		}
		// cacheName 是@注解中的value 或者cacheName的值
		//preloadsecondtime   刷新时间
		//注: 这里传过去完整的cachaname . 后面在此执行的时候,把时间都传过来, 不然就会设置成默认时间了
		CustomizedRedisCache ca = new CustomizedRedisCache(cacheName, wr, cf, ro, preloadSecondTime, name);
		return ca;
	}


	///////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * <p>
	 * Title: getCacheNames
	 * </p>
	 * <p>
	 * Description:(一句话阐述): 获取所有cachenames的集合
	 * </p>
	 * 
	 * @return
	 * @author Ran_cc
	 * @date 2018年5月28日
	 */
	@Override
	public Collection<String> getCacheNames() {
		// 
		return super.getCacheNames();
	}


}
